淺談 SQL Server WHERE 子句的 NULL 判斷
TLDR
- 在 SQL Server 的
WHERE子句中,判斷欄位是否為NULL必須使用IS NULL或IS NOT NULL,使用= NULL會導致邏輯錯誤。 - SQL 的邏輯運算結果除了
TRUE與FALSE外,還存在UNKNOWN。 WHERE子句僅會篩選出結果為TRUE的資料列。- 任何值(包含
NULL本身)與NULL進行比較,結果皆為UNKNOWN。 - 建議在查詢邏輯中盡量避免產生
UNKNOWN狀態,以確保查詢結果符合預期。 - 官方建議使用
<>作為標準的不等於運算子,儘管 SQL Server 亦支援!=。
NULL 的比較邏輯與 UNKNOWN 狀態
什麼情況下會遇到這個問題:當開發者習慣使用程式語言的相等運算子(如 == 或 =)來判斷資料庫欄位是否為空值時。
在 SQL 中,NULL 代表「未知的值」。由於其未知特性,任何值與 NULL 進行比較(例如 Column = NULL),其運算結果皆為 UNKNOWN。由於 WHERE 子句只會回傳邏輯判斷為 TRUE 的資料列,因此使用 = NULL 將永遠無法篩選出任何資料。
UNKNOWN 的邏輯運算規則
若查詢條件涉及多個邏輯運算,UNKNOWN 會影響最終的判斷結果:
AND 運算邏輯
| 運算式 1 | 運算式 2 | 結果 |
|---|---|---|
| TRUE | UNKNOWN | UNKNOWN |
| UNKNOWN | UNKNOWN | UNKNOWN |
| FALSE | UNKNOWN | FALSE |
OR 運算邏輯
| 運算式 1 | 運算式 2 | 結果 |
|---|---|---|
| TRUE | UNKNOWN | TRUE |
| UNKNOWN | UNKNOWN | UNKNOWN |
| FALSE | UNKNOWN | UNKNOWN |
小結論
判斷 NULL 時務必使用 IS NULL 或 IS NOT NULL。由於 UNKNOWN 的邏輯行為較為複雜且容易產生非預期的查詢結果,建議在設計查詢條件時,應盡量避免讓邏輯運算產生 UNKNOWN 狀態。
SQL 不等於運算子規範
什麼情況下會遇到這個問題:在撰寫跨資料庫系統的 SQL 語法或進行程式碼維護時,對於 != 與 <> 的選擇感到困惑。
雖然 SQL Server 同時支援 <> 與 !=,但根據 Microsoft 官方文件,<> 才是 ANSI SQL 標準中定義的不等於運算子。
小結論
為了維持 SQL 語法的標準性與相容性,建議優先使用 <> 作為不等於的判斷運算子。
參考資料
異動歷程
- 初版文件建立。